gisR

Was ist R

R ist eine offene Programmiersprache welche ursprünglich für statistische Zwecke erstellt wurde.

Der Einsatzbereich von R hat sich heutzutage weit über die statistischen Anwendungen etabliert.

Note

Gerade für Data-Wrangling und Data-Engineering kommt die Stärke von R besonders zu tragen.

GIS mit R

Seit einiger Zeit hat sich R im Bereich GIS weiterentwickelt. Es lässt sich nun sehr einfach GIS-Prozesse mit Datenanalyse verbinden und es ist kein Medienbruch mehr nötig.

Packages (gleich wie libraries in python) - sf: Arbeiten mit Feature Classes - terra: Arbeiten mit Raster-Daten - stars: Arbeiten mit Spatio-Temporal Arrays

Bücher

Spatial Data Science

Einlsesen der Daten

# Lesen der Gebäudedaten
gwr <- read.csv("https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00002022_00004064.csv")

# gwr <- readRDS("gwr.RDS")
# 
# saveRDS(gwr, file = "gwr.RDS")

# Umwandeln in ein sf-Objekt -> Geodatenobjekt
gwr_sf <- sf::st_as_sf(gwr, coords = c("E.Gebaeudekoordinate", "N.Gebaeudekoordinate"), crs = 2056)

# interaktives Darstellen
mapview::mapview(head(gwr_sf, 20))

# gemeinden <- sf::st_read("https://maps.zh.ch/wfs/OGDZHWFS", layer="ms:ogd-0095_arv_basis_up_gemeinden_seen_f")

# Lesen des Gemeindelayers
gemeinden <- sf::read_sf("Gemeindegrenzen_-OGD.gpkg", layer = "UP_GEMEINDEN_F")

Analysieren der Daten

# Matchen der Gemeindeinformation an die GWR-Daten
# Die geometrie wird hier entfernt, da die Datenanalyse danach viel schneller läuft
gwr_sf_gem <- gwr_sf %>% 
  dplyr::select(Gebaeudekategorie_Code, Gebaeudekategorie_Bezeichnung) %>% 
  sf::st_join(gemeinden) %>% 
  sf::st_drop_geometry()


# Berechnung der Anteile der Geböude ohne Wohnnutzung am gesamten Gebäudebestand einer Gemeinde
geb_ohne_wohnnutzung_pro_gem <- gwr_sf_gem %>% 
  dplyr::group_by(Gebaeudekategorie_Code, Gebaeudekategorie_Bezeichnung, BFS, GEMEINDENAME) %>% 
  dplyr::summarise(anzahl = n()) %>% 
  dplyr::ungroup() %>% 
  dplyr::group_by(BFS, GEMEINDENAME) %>% 
  dplyr::mutate(anteil = round(anzahl/sum(anzahl)*100, 2)) %>% 
  dplyr::ungroup() %>% 
  dplyr::filter(Gebaeudekategorie_Code == 1060)

Darstellen der Daten

# Hinzufügen der Gemeindepolygone
# Herausfiltern der Seen und fixen der Polygone
geb_ohne_wohnutzung_sf <- gemeinden %>% 
  dplyr::select(BFS) %>% 
  dplyr::left_join(geb_ohne_wohnnutzung_pro_gem, by = "BFS") %>% 
  dplyr::filter(BFS != 0) %>% 
  sf::st_make_valid() %>% 
  # tmap vewendet die erste Spalte als Bezeichner, deshalb hier die Änderung in der Spaltenanordnung
  dplyr::select(GEMEINDENAME, dplyr::everything())


geb_ohne_wohnnutzung_sf_generalized <- geb_ohne_wohnutzung_sf %>% 
  rmapshaper::ms_simplify(keep = 0.005)

# Setzt tmap auf interaktiv
tmap::tmap_mode("view")

# Darstellen der Choropletenkarte
tmap::tm_shape(geb_ohne_wohnnutzung_sf_generalized) +
    tmap::tm_polygons("anteil")

Remote Sensing mit R

Extensiv genutzte Wiesen müssen mindestens einmal pro Jahr gemäht werden und das Schnittgut muss abgeführt werden. Die Flächen dürfen in Abhängigkeit der Zone jeweils frühestens Mitte Juni bis Mitte Juli genutzt werden1

Fragestellung

Gibt es Landwirtschaftsflächen mit Schnittzeitpunkt 15. Juni, welche bereits vorher gemäht wurden?

Workflow:1

  • Sentinel-2 Bilder herunterladen
  • NDVI berechnen
  • Statistik für Landwirtschaftsflächen

STAC

  • SpatioTemporal Asset Catalog1

  • Wir benutzen den Planetary Computer Data Catalog von Microsoft2

STAC

stac_source <- rstac::stac(
  "https://planetarycomputer.microsoft.com/api/stac/v1",
  force_version = "1.0.0"
)
collections_query <- stac_source %>%
  rstac::collections()

rstac::get_request(collections_query)
###Collections
- collections (123 item(s)):
  - daymet-annual-pr
  - daymet-daily-hi
  - 3dep-seamless
  - 3dep-lidar-dsm
  - fia
  - sentinel-1-rtc
  - gridmet
  - daymet-annual-na
  - daymet-monthly-na
  - daymet-annual-hi
  - ... with 113 more collection(s).
- field(s): collections, links
# BBOX definieren
ktzh_bbox <- "8.3576933717031, \
              47.159435621727, \
              8.9849509769386, \
              47.694469737114"

# STAC Query bauen
stac_query <- rstac::stac_search(
  q = stac_source,
  collections = "sentinel-2-l2a",
  datetime = "2023-06-10/2023-06-14",
  bbox = ktzh_bbox
) %>%
  ext_filter(
    `eo:cloud_cover` <= 20)

Geodaten von WFS laden

wfs_zh <- "https://maps.zh.ch/wfs/OGDZHWFS"

url <- httr::parse_url(wfs_zh)
url$query <- list(service = "WFS",
                  version = "2.0.0",
                  request = "GetFeature",
                  typename = "ms:ogd-0095_arv_basis_up_bezirke_f",
                  outputformat = "geojson"
                  )

request <- httr::build_url(url)
bezirke <- sf::read_sf(request)

# Save Bezirke Layer
sf::write_sf(bezirke, "geodata/Bezirke.gpkg")

Raster

  • 4 Bänder -> 1 stars-Objekt
  • Visualisierung & Speicherung als 4-Band Raster
RGB FCIR
RGB FCIR

NDVI

Quelle

Rasterrechner

\[ NDVI = \frac{(NIR - R)}{NIR + R} \]

# Calculate NDVI using Red and NIR Bands -----------------------------------
ndvi_fn <- function(b1, b2, b3, b4) (b4 - b1)/(b4 + b1)

s2_ndvi <- st_apply(RGBI_zh, c("x", "y"), ndvi_fn)
stars::write_stars(s2_ndvi, "geodata/ndvi_float32.tif", type = "Float32")

Statistik

# Load Polygon Layer
LWNutz_Diels <- sf::read_sf("geodata/LWNutz_Dielsdorf.gpkg") %>%
  mutate(area = sf::st_area(geom))

# Set aller Flächen, die erst am 15.06. sollten geschnitten werden:
BF_Fl <- LWNutz_Diels %>%
  filter(harvest_date == "15.06.") %>%
  # Drop die kleinsten Flächen unter 500 m^2
  filter(area > units::set_units(500, "m^2"))

Zonale Statistik

# Load Raster
ndvi_rast <- terra::rast("geodata/ndvi_float32.tif")

# Reproject it, so it does align with the Polygons
ndvi_2056 <- terra::project(ndvi_rast, "EPSG:2056", method="bilinear")



# calculate mean NDVI for every feature:
BF_Fl$mean_ndvi <- exact_extract(ndvi_2056, BF_Fl, 'mean', progress=TRUE,
                                 max_cells_in_memory = 1e4)

  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |                                                                      |   1%
  |                                                                            
  |=                                                                     |   1%
  |                                                                            
  |=                                                                     |   2%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |==                                                                    |   3%
  |                                                                            
  |==                                                                    |   4%
  |                                                                            
  |===                                                                   |   4%
  |                                                                            
  |===                                                                   |   5%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |====                                                                  |   6%
  |                                                                            
  |=====                                                                 |   6%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |=====                                                                 |   8%
  |                                                                            
  |======                                                                |   8%
  |                                                                            
  |======                                                                |   9%
  |                                                                            
  |=======                                                               |   9%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |=======                                                               |  11%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |========                                                              |  12%
  |                                                                            
  |=========                                                             |  12%
  |                                                                            
  |=========                                                             |  13%
  |                                                                            
  |=========                                                             |  14%
  |                                                                            
  |==========                                                            |  14%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |===========                                                           |  15%
  |                                                                            
  |===========                                                           |  16%
  |                                                                            
  |============                                                          |  16%
  |                                                                            
  |============                                                          |  17%
  |                                                                            
  |============                                                          |  18%
  |                                                                            
  |=============                                                         |  18%
  |                                                                            
  |=============                                                         |  19%
  |                                                                            
  |==============                                                        |  19%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |==============                                                        |  21%
  |                                                                            
  |===============                                                       |  21%
  |                                                                            
  |===============                                                       |  22%
  |                                                                            
  |================                                                      |  22%
  |                                                                            
  |================                                                      |  23%
  |                                                                            
  |================                                                      |  24%
  |                                                                            
  |=================                                                     |  24%
  |                                                                            
  |=================                                                     |  25%
  |                                                                            
  |==================                                                    |  25%
  |                                                                            
  |==================                                                    |  26%
  |                                                                            
  |===================                                                   |  26%
  |                                                                            
  |===================                                                   |  27%
  |                                                                            
  |===================                                                   |  28%
  |                                                                            
  |====================                                                  |  28%
  |                                                                            
  |====================                                                  |  29%
  |                                                                            
  |=====================                                                 |  29%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |=====================                                                 |  31%
  |                                                                            
  |======================                                                |  31%
  |                                                                            
  |======================                                                |  32%
  |                                                                            
  |=======================                                               |  32%
  |                                                                            
  |=======================                                               |  33%
  |                                                                            
  |=======================                                               |  34%
  |                                                                            
  |========================                                              |  34%
  |                                                                            
  |========================                                              |  35%
  |                                                                            
  |=========================                                             |  35%
  |                                                                            
  |=========================                                             |  36%
  |                                                                            
  |==========================                                            |  36%
  |                                                                            
  |==========================                                            |  37%
  |                                                                            
  |==========================                                            |  38%
  |                                                                            
  |===========================                                           |  38%
  |                                                                            
  |===========================                                           |  39%
  |                                                                            
  |============================                                          |  39%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |============================                                          |  41%
  |                                                                            
  |=============================                                         |  41%
  |                                                                            
  |=============================                                         |  42%
  |                                                                            
  |==============================                                        |  42%
  |                                                                            
  |==============================                                        |  43%
  |                                                                            
  |==============================                                        |  44%
  |                                                                            
  |===============================                                       |  44%
  |                                                                            
  |===============================                                       |  45%
  |                                                                            
  |================================                                      |  45%
  |                                                                            
  |================================                                      |  46%
  |                                                                            
  |=================================                                     |  46%
  |                                                                            
  |=================================                                     |  47%
  |                                                                            
  |=================================                                     |  48%
  |                                                                            
  |==================================                                    |  48%
  |                                                                            
  |==================================                                    |  49%
  |                                                                            
  |===================================                                   |  49%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |===================================                                   |  51%
  |                                                                            
  |====================================                                  |  51%
  |                                                                            
  |====================================                                  |  52%
  |                                                                            
  |=====================================                                 |  52%
  |                                                                            
  |=====================================                                 |  53%
  |                                                                            
  |=====================================                                 |  54%
  |                                                                            
  |======================================                                |  54%
  |                                                                            
  |======================================                                |  55%
  |                                                                            
  |=======================================                               |  55%
  |                                                                            
  |=======================================                               |  56%
  |                                                                            
  |========================================                              |  56%
  |                                                                            
  |========================================                              |  57%
  |                                                                            
  |========================================                              |  58%
  |                                                                            
  |=========================================                             |  58%
  |                                                                            
  |=========================================                             |  59%
  |                                                                            
  |==========================================                            |  59%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |==========================================                            |  61%
  |                                                                            
  |===========================================                           |  61%
  |                                                                            
  |===========================================                           |  62%
  |                                                                            
  |============================================                          |  62%
  |                                                                            
  |============================================                          |  63%
  |                                                                            
  |============================================                          |  64%
  |                                                                            
  |=============================================                         |  64%
  |                                                                            
  |=============================================                         |  65%
  |                                                                            
  |==============================================                        |  65%
  |                                                                            
  |==============================================                        |  66%
  |                                                                            
  |===============================================                       |  66%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |===============================================                       |  68%
  |                                                                            
  |================================================                      |  68%
  |                                                                            
  |================================================                      |  69%
  |                                                                            
  |=================================================                     |  69%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |=================================================                     |  71%
  |                                                                            
  |==================================================                    |  71%
  |                                                                            
  |==================================================                    |  72%
  |                                                                            
  |===================================================                   |  72%
  |                                                                            
  |===================================================                   |  73%
  |                                                                            
  |===================================================                   |  74%
  |                                                                            
  |====================================================                  |  74%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |=====================================================                 |  75%
  |                                                                            
  |=====================================================                 |  76%
  |                                                                            
  |======================================================                |  76%
  |                                                                            
  |======================================================                |  77%
  |                                                                            
  |======================================================                |  78%
  |                                                                            
  |=======================================================               |  78%
  |                                                                            
  |=======================================================               |  79%
  |                                                                            
  |========================================================              |  79%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |========================================================              |  81%
  |                                                                            
  |=========================================================             |  81%
  |                                                                            
  |=========================================================             |  82%
  |                                                                            
  |==========================================================            |  82%
  |                                                                            
  |==========================================================            |  83%
  |                                                                            
  |==========================================================            |  84%
  |                                                                            
  |===========================================================           |  84%
  |                                                                            
  |===========================================================           |  85%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |============================================================          |  86%
  |                                                                            
  |=============================================================         |  86%
  |                                                                            
  |=============================================================         |  87%
  |                                                                            
  |=============================================================         |  88%
  |                                                                            
  |==============================================================        |  88%
  |                                                                            
  |==============================================================        |  89%
  |                                                                            
  |===============================================================       |  89%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |===============================================================       |  91%
  |                                                                            
  |================================================================      |  91%
  |                                                                            
  |================================================================      |  92%
  |                                                                            
  |=================================================================     |  92%
  |                                                                            
  |=================================================================     |  93%
  |                                                                            
  |=================================================================     |  94%
  |                                                                            
  |==================================================================    |  94%
  |                                                                            
  |==================================================================    |  95%
  |                                                                            
  |===================================================================   |  95%
  |                                                                            
  |===================================================================   |  96%
  |                                                                            
  |====================================================================  |  96%
  |                                                                            
  |====================================================================  |  97%
  |                                                                            
  |====================================================================  |  98%
  |                                                                            
  |===================================================================== |  98%
  |                                                                            
  |===================================================================== |  99%
  |                                                                            
  |======================================================================|  99%
  |                                                                            
  |======================================================================| 100%
{tmap_mode("plot")
tmap_options(check.and.fix = TRUE)

left <- tm_shape(BF_Fl) +
tm_polygons("mean_ndvi",
            style = "fixed",
            breaks = c(-0.4, -0.2, 0, 0.2, 0.4, 1)
            )
right <- tm_shape(BF_Fl %>% 
                    filter(mean_ndvi <= 0.3)) +
  tm_polygons("mean_ndvi",
              style = "fixed",
              breaks = c(-0.4, -0.2, 0, 0.2, 0.4, 1)
              )

tmap_arrange(
  left,
  right
)}
BF_Fl %>% filter(mean_ndvi <= 0.3) %>% 
  dplyr::select(c("blw_name","region","mean_ndvi", "area"))
Simple feature collection with 2 features and 4 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 2678515 ymin: 1267933 xmax: 2678605 ymax: 1268029
Projected CRS: CH1903+ / LV95
# A tibble: 2 × 5
  blw_name                      region mean_ndvi  area                      geom
  <chr>                         <chr>      <dbl> [m^2]             <POLYGON [m]>
1 Extensiv genutzte Wiesen (oh… Flugp…     0.246  943. ((2678527 1267936, 26785…
2 Extensiv genutzte Wiesen (oh… Flugp…     0.281  548. ((2678515 1267944, 26785…